package br.com.ufc.contoller;

import br.com.ufc.exception.IntegrationException;
import br.com.ufc.model.TarefaTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.ufc.exception.BusinessException;
import br.com.ufc.model.Tarefa;
import br.com.ufc.model.TarefaDesenvolvimento;
import br.com.ufc.model.TarefaDesenvolvimentoAuto;

public class AgendaHash implements Agendavel {

    private Map<Integer, Tarefa> tarefas;
    private Long indice = 0L;

    public Map<Integer, Tarefa> getTarefas() {
        return tarefas;
    }

    public void setTarefas(Integer tamanhoArray) {
        this.tarefas = new HashMap<Integer, Tarefa>();
    }

    public Boolean cadastrarTarefa(Tarefa t) {
        // seta o codigo da tarefa caso a implementacao da classe tarefa n�o
        // gere automaticamente
        if (!(t instanceof TarefaDesenvolvimentoAuto)) {
            t.setCodigo(++indice);
        }
        this.tarefas.put(t.getCodigo().intValue(), t);
        return true;
    }

    public Tarefa consultarTarefa(Long codigo) {
        Tarefa t = this.tarefas.get(codigo.intValue());
        if (t != null) {
            return t;
        }
        System.out.println("INFO: Nenhuma tarefa com o c�digo " + codigo.intValue());
        return null;
    }

    @Override
    public Boolean encerrarTarefa(Tarefa t, Double valorCobrado) {
        if (t != null) {
            t.encerrarTarefa(valorCobrado);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Boolean encerrarTodasTarefas() {
        for (Tarefa t : this.tarefas.values()) {
            if (t != null) {
                t.encerrarTarefa(0D);
                return true;
            }
        }
        return false;
    }

    @Override
    public Boolean iniciarTarefa(Tarefa t) {
        if (t != null) {
            return t.iniciarTarefa();
        } else {
            return false;
        }
    }

    public void iniciarTarefa(Long codigo) throws IntegrationException {
        Tarefa t = consultarTarefa(codigo);
        iniciarTarefa(t);
    }

    @Override
    public Boolean removerTarefa(Tarefa t) {
        if (t != null) {
            if (this.tarefas.remove(t.getCodigo().intValue()) != null) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public Tarefa consultarTarefaPorCodigo(Long codigo) {
        return null;
    }

    @Override
    public void incrementarImportancia(Tarefa t) {
        t.incrementarImportancia();
    }

    @Override
    public Boolean cancelarTarefa(Tarefa t) {
        return t.cancelarTarefa();
    }

    @Override
    public Boolean reiniciarTarefa(Tarefa t) throws BusinessException {
        return t.iniciarTarefa();
        /*if (t instanceof TarefaDesenvolvimento) {
            return ((TarefaDesenvolvimento) t).reinicarTarefa();
        } else {
            throw new BusinessException(
                    "N�o � poss�vel reiniciar uma tarefa do tipo GERENCIAL");
        }
         * 
         */
    }

    @Override
    public TarefaTO listarTarefas() {
        TarefaTO aTO = new TarefaTO();
        List<Tarefa> listTarefas = new ArrayList<Tarefa>();
        for (Tarefa t : this.tarefas.values()) {
            listTarefas.add(t);
        }
        aTO.setListaTarefas(listTarefas);
        return aTO;
    }

    public void cancelarTarefa(Long codigo) throws IntegrationException {
            Tarefa t = consultarTarefa(codigo);
            cancelarTarefa(t);
    }

    public void encerrarTarefa(Long codigo, Double valorCobrado) throws IntegrationException {
        Tarefa t = consultarTarefa(codigo);
        encerrarTarefa(t, valorCobrado);
    }

    public void removerTarefa(Long codigo) throws IntegrationException {
        Tarefa t = consultarTarefa(codigo);
        removerTarefa(t);
    }

    public void reiniciarTarefa(Long codigo) throws IntegrationException {
        try {
            Tarefa t = consultarTarefa(codigo);
            reiniciarTarefa(t);
        } catch (BusinessException ex) {
            throw new IntegrationException(ex.getMessage());
        }
    }
}
